package git.soulbgm.security.service;

import git.soulbgm.common.pojo.PageInfo;
import git.soulbgm.pojo.vo.OnlineUserInfo;
import git.soulbgm.security.pojo.LoginUser;

import java.util.Date;
import java.util.List;

/**
 * 在线用户服务
 *
 * @author SoulBGM
 * @date 2021-09-08
 */
public abstract class OnlineUserService {

    protected boolean isSave(String username, String loginIpAddress, String dbUsername, String dbLoginIpAddress) {
        if (username != null && loginIpAddress != null && !username.equals(dbUsername) && !loginIpAddress.equals(dbLoginIpAddress)) {
            return false;
        }
        if (username != null && !username.equals(dbUsername)) {
            return false;
        }
        if (loginIpAddress != null && !loginIpAddress.equals(dbLoginIpAddress)) {
            return false;
        }
        return true;
    }

    protected void addOnlineUserInfo(String username, String loginIpAddress, List<OnlineUserInfo> onlineUserInfoList, String sessionId, LoginUser loginUser) {
        String dbUsername = loginUser.getUsername();
        String dbLoginIpAddress = loginUser.getLoginIpAddress();
        if (!isSave(username, loginIpAddress, dbUsername, dbLoginIpAddress)) {
            return;
        }
        OnlineUserInfo onlineUserInfo = OnlineUserInfo.builder()
                .sessionId(sessionId)
                .userId(loginUser.getId())
                .nickname(loginUser.getNickname())
                .username(dbUsername)
                .loginTime(new Date(loginUser.getLoginTime()))
                .loginIpAddress(dbLoginIpAddress)
                .build();
        onlineUserInfoList.add(onlineUserInfo);
    }

    /**
     * 获取在线用户
     *
     * @param username       用户名
     * @param loginIpAddress 登录ip地址
     * @return {@link List<OnlineUserInfo>}
     */
    public abstract List<OnlineUserInfo> getOnlineUser(String username, String loginIpAddress);

    /**
     * 强退用户
     *
     * @param sessionList 会话列表 value: sessionId:用户名
     * @return boolean
     */
    public abstract boolean forcedOfflineUser(List<String> sessionList);

}
